String Natural Compare

Compare alphanumeric strings the same way a human would, using a natural order algorithm (originally known as the alphanum algorithm) where numeric characters are sorted based on their numeric values rather than their ASCII values.
Standard sorting: Natural order sorting:
img1.png img1.png
img10.png img2.png
img12.png img10.png
img2.png img12.png
This module exports a function that returns a number indicating whether one string should come before, after, or is the same as another string.
It can be used directly with the native .sort()
array method.
Fast and Robust
This module can compare strings containing any size of number and is heavily tested with a custom benchmark suite to make sure that it is as fast as possible.
Installation
npm install string-natural-compare
yarn add string-natural-compare
Usage
naturalCompare(strA, strB[, options])
strA
(string)
strB
(string)
options
(object) - Optional options object with the following options:
caseInsensitive
(boolean) - Set to true
to compare strings case-insensitively. Default: false
.
alphabet
(string) - A string of characters that define a custom character ordering. Default: undefined
.
const naturalCompare = require('string-natural-compare');
const files = ['z1.doc', 'z10.doc', 'z17.doc', 'z2.doc', 'z23.doc', 'z3.doc'];
files.sort(naturalCompare);
const chars = ['B', 'C', 'a', 'd'];
const naturalCompareCI = (a, b) => naturalCompare(a, b, {caseInsensitive: true});
chars.sort(naturalCompareCI);
['a', 'A'].sort(naturalCompareCI);
['A', 'a'].sort(naturalCompareCI);
naturalCompare(
'1165874568735487968325787328996865',
'265812277985321589735871687040841'
);
const hotelRooms = [
{street: '350 5th Ave', room: 'A-1021'},
{street: '350 5th Ave', room: 'A-21046-b'}
];
hotelRooms.sort((a, b) => (
naturalCompare(a.street, b.street, {caseInsensitive: true}) ||
naturalCompare(a.room, b.room)
));
const cars = [
{make: 'Audi', model: 'R8'},
{make: 'Porsche', model: '911 Turbo S'}
];
for (const car of cars) {
car.sortKey = (car.make + ' ' + car.model).toLowerCase();
}
cars.sort((a, b) => naturalCompare(a.sortKey, b.sortKey));
const russianOpts = {
alphabet: 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя',
};
['Ё', 'А', 'б', 'Б'].sort((a, b) => naturalCompare(a, b, russianOpts));
Note: Putting numbers in the custom alphabet can cause undefined behaviour.